package pl.edu.agh.to1.dice.logic;

public class Player {
	// pola
	String name;
	int score;
	int general;
	int variant;
	Dice[] kosci = new Dice[5];
	int[] warKosci = new int[6];
	Table pTablica;
	private RankingEntry entry;

	Player(int wariant,RankingEntry entry) {
		for (int i = 0; i < 5; i++) {
			this.kosci[i] = new Dice();
		}
		general = 0;
		score = 0;
		variant = wariant;
		this.pTablica = new Table(variant);
		this.entry = entry;
		this.name = entry.getName();
	}

	// metody
	int showScore() {
		return score;
	}

	boolean czyUzyte(int a) {
		return pTablica.czyUzyte(a);
	}

	void zmien(int a) {
		kosci[a].zmien();
	}

	void czysc() {
		for (int i = 0; i < 5; i++)
			kosci[i].odblokuj();
	}

	void uzyj(int a) {
		pTablica.uzyj(a);
	}

	void updateWarKosci() {
		zerujWarKosci();
		for (int i = 0; i < 5; i++) {
			warKosci[kosci[i].DiceWart() - 1] += 1;
		}
		updatePunkty();
	}//

	void zerujWarKosci() {
		for (int i = 0; i < 6; i++) {
			warKosci[i] = 0;
		}

	}

	void tasuj() {
		for (int i = 0; i < 5; i++) {
			kosci[i].losuj();
		}
		updateWarKosci();
	}

	void wyswKosci() {
		for (int i = 0; i < 5; i++) {
			System.out.printf("Kosc numer " + (i + 1) + " : "
					+ kosci[i].DiceWart());
			if (kosci[i].lock) {
				System.out.print(" L");
			}
			System.out.print("\n");
		}

	}

	public void rankingUpdate(){
		entry.onGameFinish(score);
	}

	void wyniki() {
		pTablica.wyswietl();
	}

	void updatePunkty() {
		pTablica.zeruj();

		// warKosci trzyma ich liczbe
		// jedynki
		pTablica.tRow[0].zmienA(warKosci[0] * 1);
		// dwojki
		pTablica.tRow[1].zmienA(warKosci[1] * 2);
		// trojki
		pTablica.tRow[2].zmienA(warKosci[2] * 3);
		// czworki
		pTablica.tRow[3].zmienA(warKosci[3] * 4);
		// piatki
		pTablica.tRow[4].zmienA(warKosci[4] * 5);
		// szostki
		pTablica.tRow[5].zmienA(warKosci[5] * 6);
		// 3 jednakowe
		// 4 jednakowe
		// full
		// general
		boolean full = false;
		for (int i = 0; i < 6; i++) {
			if (warKosci[i] == 2) {
				full = true;
			}
		}

		for (int i = 0; i < 6; i++) {
			if (warKosci[i] >= 3) {
				pTablica.tRow[8].zmienA(warKosci[0] * 1 + warKosci[1] * 2
						+ warKosci[2] * 3 + warKosci[3] * 4 + warKosci[4] * 5
						+ warKosci[5] * 6);
				if (full == true) {
					pTablica.tRow[10].zmienA(25);
				}
			}
			if (warKosci[i] == 5) {
				pTablica.tRow[13].zmienA(50);
			}

			if (warKosci[i] >= 4) {
				pTablica.tRow[9].zmienA(warKosci[0] * 1 + warKosci[1] * 2
						+ warKosci[2] * 3 + warKosci[3] * 4 + warKosci[4] * 5
						+ warKosci[5] * 6);
			}

		}
		// maly strit//duzy strit
		if (warKosci[0] >= 1 && warKosci[1] >= 1 && warKosci[2] >= 1
				&& warKosci[3] >= 1) {
			pTablica.tRow[11].zmienA(30);
			if (warKosci[4] >= 1) {
				pTablica.tRow[12].zmienA(40);
			}
		}
		if (warKosci[1] >= 1 && warKosci[2] >= 1 && warKosci[3] >= 1
				&& warKosci[4] >= 1) {
			pTablica.tRow[11].zmienA(30);
			if (warKosci[5] >= 1) {
				pTablica.tRow[12].zmienA(40);
			}
		}
		if (warKosci[2] >= 1 && warKosci[3] >= 1 && warKosci[4] >= 1
				&& warKosci[5] >= 1) {
			pTablica.tRow[11].zmienA(30);
		}
		// szansa
		pTablica.tRow[14].zmienA(warKosci[0] * 1 + warKosci[1] * 2
				+ warKosci[2] * 3 + warKosci[3] * 4 + warKosci[4] * 5
				+ warKosci[5] * 6);

		// general bonus
		if (pTablica.valA(13) == 50) {
			if (pTablica.valB(13) == 50)
				general += 1;

		}
		// parzyste oraz nieparzyste

		if (warKosci[0] != 0 || warKosci[2] != 0 || warKosci[4] != 0)
			pTablica.tRow[15].zmienA(warKosci[0] * 1 + warKosci[2] * 3
					+ warKosci[4] * 5);

		if (warKosci[1] != 0 || warKosci[3] != 0 || warKosci[5] != 0)
			pTablica.tRow[16].zmienA(warKosci[1] * 2 + warKosci[3] * 4
					+ warKosci[5] * 6);
		if (variant == 1) {
			pTablica.tRow[19].zmienA((pTablica.tRow[0].valueA) * 2);
			pTablica.tRow[20].zmienA((pTablica.tRow[1].valueA) * 2);
			pTablica.tRow[21].zmienA((pTablica.tRow[2].valueA) * 2);
			pTablica.tRow[22].zmienA((pTablica.tRow[3].valueA) * 2);
			pTablica.tRow[23].zmienA((pTablica.tRow[4].valueA) * 2);
			pTablica.tRow[24].zmienA((pTablica.tRow[5].valueA) * 2);
			pTablica.tRow[27].zmienA((pTablica.tRow[8].valueA) * 2);
			pTablica.tRow[28].zmienA((pTablica.tRow[9].valueA) * 2);
			pTablica.tRow[29].zmienA((pTablica.tRow[10].valueA) * 2);
			pTablica.tRow[30].zmienA((pTablica.tRow[11].valueA) * 2);
			pTablica.tRow[31].zmienA((pTablica.tRow[12].valueA) * 2);
			pTablica.tRow[32].zmienA((pTablica.tRow[13].valueA) * 2);
			pTablica.tRow[33].zmienA((pTablica.tRow[14].valueA) * 2);
			pTablica.tRow[34].zmienA((pTablica.tRow[15].valueA) * 2);
			pTablica.tRow[35].zmienA((pTablica.tRow[16].valueA) * 2);
			pTablica.tRow[37].zmienA((pTablica.tRow[0].valueA) * 3);
			pTablica.tRow[38].zmienA((pTablica.tRow[1].valueA) * 3);
			pTablica.tRow[39].zmienA((pTablica.tRow[2].valueA) * 3);
			pTablica.tRow[40].zmienA((pTablica.tRow[3].valueA) * 3);
			pTablica.tRow[41].zmienA((pTablica.tRow[4].valueA) * 3);
			pTablica.tRow[42].zmienA((pTablica.tRow[5].valueA) * 3);
			pTablica.tRow[45].zmienA((pTablica.tRow[8].valueA) * 3);
			pTablica.tRow[46].zmienA((pTablica.tRow[9].valueA) * 3);
			pTablica.tRow[47].zmienA((pTablica.tRow[10].valueA) * 3);
			pTablica.tRow[48].zmienA((pTablica.tRow[11].valueA) * 3);
			pTablica.tRow[49].zmienA((pTablica.tRow[12].valueA) * 3);
			pTablica.tRow[50].zmienA((pTablica.tRow[13].valueA) * 3);
			pTablica.tRow[51].zmienA((pTablica.tRow[14].valueA) * 3);
			pTablica.tRow[52].zmienA((pTablica.tRow[15].valueA) * 3);
			pTablica.tRow[53].zmienA((pTablica.tRow[16].valueA) * 3);
		}
		updateScoreTable();

	}

	void updateScoreTable() {
		int sumaOne = 0;
		sumaOne = pTablica.valB(0) + pTablica.valB(1) + pTablica.valB(2)
				+ pTablica.valB(3) + pTablica.valB(4) + pTablica.valB(5);
		if (sumaOne >= 63) {
			pTablica.zmienB(6, 35);
			pTablica.zmienA(6, 35);
		}
		int suma = sumaOne + pTablica.valA(6);
		pTablica.zmienB(7, suma);

		int sumaTwo = 0;
		sumaTwo = pTablica.valB(8) + pTablica.valB(9) + pTablica.valB(10)
				+ pTablica.valB(11) + pTablica.valB(12) + pTablica.valB(13)
				+ pTablica.valB(14) + pTablica.valB(15) + pTablica.valB(16);
		pTablica.zmienB(17, sumaTwo);
		if (variant == 1) {
			int sum;
			int sumThree = pTablica.valB(19) + pTablica.valB(20)
					+ pTablica.valB(21) + pTablica.valB(22) + pTablica.valB(23)
					+ pTablica.valB(24);
			int sumFour = pTablica.valB(37) + pTablica.valB(38)
					+ pTablica.valB(39) + pTablica.valB(40) + pTablica.valB(41)
					+ pTablica.valB(42);
			int sumFive = pTablica.valB(27) + pTablica.valB(28)
					+ pTablica.valB(29) + pTablica.valB(30) + pTablica.valB(31)
					+ pTablica.valB(32) + pTablica.valB(33) + pTablica.valB(34)
					+ pTablica.valB(35);
			int sumSix = pTablica.valB(45) + pTablica.valB(46)
					+ pTablica.valB(47) + pTablica.valB(48) + pTablica.valB(49)
					+ pTablica.valB(50) + pTablica.valB(51) + pTablica.valB(52)
					+ pTablica.valB(53);
			if (sumThree >= 126) {
				pTablica.zmienB(25, 70);
				pTablica.zmienA(25, 70);
			}
			sum = sumThree + pTablica.valA(25);
			pTablica.zmienB(26, sum);
			if (sumFour >= 189) {
				pTablica.zmienB(43, 105);
				pTablica.zmienA(43, 105);
			}
			sum = sumFour + pTablica.valA(43);
			pTablica.zmienB(44, sum);
			pTablica.zmienB(36, sumFive);
			pTablica.zmienB(54, sumSix);
			pTablica.zmienB(
					18,
					(suma + sumaTwo + sumThree + sumFour + sumFive + sumSix
							+ pTablica.valB(25) + pTablica.valA(43) + (general * 100)));
		}

		else
			pTablica.zmienB(18, (suma + sumaTwo + (general * 100)));

	}
}// gracz